home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / DESQVIEW / MDOS401.ARJ / MSGTEST.C < prev    next >
C/C++ Source or Header  |  1990-10-02  |  2KB  |  123 lines

  1. /* MSGTEST.C */
  2.  
  3. #include <ctype.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <fcntl.h>
  9.  
  10. union REGS inregs;
  11. union REGS outregs;
  12. struct SREGS segregs;
  13.  
  14. /* convert a pointer to its segment and offset */
  15.  
  16. void segoff(val,seg,off)
  17. int *val,*seg,*off;
  18. {
  19.    *seg = *(val + 1);
  20.    *off = *val;
  21. }
  22.  
  23. /* given a segment and offset, make a pointer */
  24.  
  25. void makptr(seg,off,adrptr)
  26. int seg, off;
  27. int *adrptr;
  28. {
  29.     *(adrptr+1) = seg;
  30.     *adrptr     = off;
  31. }
  32.  
  33. /*  put a message on a queue  */
  34.  
  35. void putmsg(msg, qnum)
  36. char *msg;
  37. int qnum;
  38. {
  39.     inregs.h.ah = 4;  /* send msg to q */
  40.     inregs.h.al = qnum;  /* msg q num */
  41.     inregs.x.cx = strlen(msg);  /* message buffer length */
  42.     segoff(&msg, &(segregs.ds), &(inregs.x.si));
  43.     int86x(0x15, &inregs, &outregs, &segregs);
  44.     if (outregs.h.ah != 0) 
  45.         printf("send message error: %d\n",outregs.h.ah);
  46.     return;
  47. }
  48.  
  49. /* routine to get a message from a queue */
  50.  
  51. void getmsg(msg, qnum)
  52. char *msg;
  53. int qnum;
  54. {
  55.     int i;
  56.     
  57.     for (i = 0;i < 150; ++i) msg[i] = '\0';
  58.     inregs.h.ah = 5;  /* test message queue */
  59.     inregs.h.al = qnum;
  60.     int86(0x15, &inregs, &outregs);
  61.     if (outregs.h.ah != 0)
  62.     {
  63.         printf("test message queue error: %d\r\n", outregs.h.ah);
  64.         return;
  65.     }
  66.     if (outregs.x.dx == 0)
  67.     {
  68.         printf("no messages on queue: %d\r\n", qnum);
  69.         return;
  70.     }
  71.     inregs.h.ah = 6;  /* get msg from q */
  72.     inregs.h.al = qnum;  /* msg q num */
  73.     inregs.x.cx = 100;  /* message buffer length */
  74.     segoff(&msg, &(segregs.es), &(inregs.x.di));
  75.     int86x(0x15, &inregs, &outregs, &segregs);
  76.     return;
  77. }
  78.  
  79. /****************/
  80. /* main program */
  81. /****************/
  82.  
  83. void main()
  84. {
  85.     char dspbuf[100], numbuf[50];
  86.     int i, qnum;
  87.     
  88.     for (;;) 
  89.     {
  90.         printf("\r\n(S)end (R)eceive (Q)uit? ");
  91.         i = getche();
  92.         printf("\r\n");
  93.         switch (i) {
  94.             case 'S' :
  95.             case 's' :
  96.                 printf("Queue number to send to (0 - 32)?: ");
  97.                 gets(numbuf);
  98.                 qnum = atoi(numbuf);
  99.                 printf("\r\nenter message text\n");
  100.                 gets(dspbuf);
  101.                 putmsg(dspbuf, qnum);
  102.                 break;
  103.             case 'R' :
  104.             case 'r' :
  105.                 printf(
  106.                   "Queue number to receive from (0 - 32)?: ");
  107.                 gets(numbuf);
  108.                 qnum = atoi(numbuf);
  109.                 getmsg(dspbuf, qnum);
  110.                 printf("\r\n%s\r\n",dspbuf);
  111.                 break;
  112.             case 'Q' :
  113.             case 'q' :
  114.                 printf("\r\nexiting\r\n");
  115.                 exit(0);
  116.             default :
  117.                 printf("\r\ninvalid command\r\n");
  118.                 break;
  119.         }
  120.     }
  121. }
  122.  
  123.